package com.whxd.system.user.service;

import java.util.List;

import org.apache.http.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.hsview.client.HsviewClient;
import com.hsview.client.HsviewResponse;
import com.hsview.client.api.civil.open.GetDevices.Response;
import com.hsview.client.api.civil.user.AddSubUser;
import com.whxd.framework.common.exception.BusinessException;
import com.whxd.smarthome.Config;
import com.whxd.smarthome.api.rest.DhUserRestController;
import com.whxd.system.authority.entity.Authority;
import com.whxd.system.user.entity.User;
import com.whxd.system.user.repository.UserDao;

/**
 * @author 张世鹏
 */
@Service
@Transactional
public class UserServiceImpl implements UserService {
	private static Logger logger = LoggerFactory.getLogger(DhUserRestController.class);

	@Autowired
	private UserDao userDao;
	// @Autowired
	// private RoleDao roleDao;

	private final static Logger log = LoggerFactory.getLogger(UserServiceImpl.class);

	// public void add(UserDto dto) {
	// if (!dto.getPassword().equals(dto.getRepassword())) {
	// throw new BusinessException("两次密码不同");
	// }
	// User u = userDao.findByUsername(dto.getUsername());
	// if (u != null) {
	// throw new BusinessException("用户名已经存在");
	// }
	// User user = BeanMapper.map(dto, User.class);
	// user.setCreatedTime(new Date());
	// user.setFullnamePinyin(PinyinUtils.toPinyin(user.getFullname())
	// .toLowerCase());
	// userDao.save(user);
	//
	// }
	//
	// public void update(UserDto dto) {
	// User user = userDao.findOne(dto.getId());
	// // 如果user的password为空，表示没有修改密码
	// if (StringUtils.isNotBlank(dto.getPassword())) {
	// user.setPassword(dto.getPassword());
	// }
	// user.setAge(dto.getAge());
	// user.setBirthday(dto.getBirthday());
	// user.setEmail(dto.getEmail());
	// user.setEnabled(dto.getEnabled());
	// user.setFullname(dto.getFullname());
	// user.setPhone(dto.getPhone());
	// user.setSex(dto.getSex());
	// user.setFullnamePinyin(PinyinUtils.toPinyin(user.getFullname()));
	//
	// userDao.save(user);
	// }
	//
	// public void delete(Long id) {
	// userDao.delete(id);
	// }
	//
	// // public void grantRoles(UserDto dto) {
	// // User user = userDao.findOne(dto.getId());
	// // List<Role> roles = roleDao.findByIds(dto.getRoleIds());
	// // user.setRoles(roles);
	// // }
	//
	public User findOne(Long id) {
		return userDao.findOne(id);
	}

	// public PageResult<UserGridDto> findByCondition(PageParam page,
	// UserCondition condition) {
	// PageResult<User> list = userDao.findByCondition(page, condition);
	// // 将User转换成UserDto
	// PageResult<UserGridDto> result = new PageResult<UserGridDto>();
	// result.setTotal(list.getTotal());
	// result.setRows(BeanMapper.mapList(list.getRows(), UserGridDto.class, new
	// BeanMapperChanger<User, UserGridDto>() {
	//
	// @Override
	// public void change(User source, UserGridDto dest) {
	// // 查询数据字典，将sex字段编程文本形式
	// Dictionary dict = Dictionary.findByKey(source.getSex());
	// if (dict != null) {
	// dest.setSexStr(dict.getName());
	// } else {
	// dest.setSexStr(source.getSex());
	// }
	//
	// dest.setPositionIds(positionIds);
	// dest.setPositionNames(positionNames);
	// }
	// }));
	// return result;
	// }

	// @Override
	// public PageResult<UserGridDto> findByUserSelectCondition(PageParam page,
	// UserSelectCondition condition) {
	// PageResult<User> list = userDao.findByUserSelectCondition(page,
	// condition);
	// // 将User转换成UserDto
	// PageResult<UserGridDto> result = new PageResult<UserGridDto>();
	// result.setTotal(list.getTotal());
	// result.setRows(BeanMapper.mapList(list.getRows(), UserGridDto.class, new
	// BeanMapperChanger<User, UserGridDto>() {
	//
	// @Override
	// public void change(User source, UserGridDto dest) {
	// // 查询数据字典，将sex字段编程文本形式
	// Dictionary dict = Dictionary.findByKey(source.getSex());
	// if (dict != null) {
	// dest.setSexStr(dict.getName());
	// } else {
	// dest.setSexStr(source.getSex());
	// }
	// }
	// }));
	// return result;
	// }

	// @Override
	// public void deleteBatch(String ids) {
	// List<Long> idList = StringSplit.splitToLong(ids, ",");
	// for (Long id : idList) {
	// userDao.delete(id);
	// }
	// }

	public User findByUsername(String username) {
		return userDao.findByUsername(username);
	}

	// /*
	// * @see
	// * com.simple.spark.system.service.user.UserService#findUserDtoByUserName
	// * (java.lang.String)
	// */
	// @Override
	// public UserDto findUserDtoByUserName(String username) {
	// User user = userDao.findByUsername(username);
	// UserDto dto = BeanMapper.map(user, UserDto.class);
	// dto.setPassword(null);
	// dto.setRepassword(null);
	// Organization organization = user.getOrganization();
	// if (organization != null) {
	// dto.setOrganizationId(organization.getId());
	// dto.setOrganizationName(user.getOrganization().getName());
	// }
	// return dto;
	// }

	// /*
	// * @see
	// * com.simple.spark.system.service.user.UserService#updateLoginTime(java
	// * .lang.Long)
	// */
	// @Override
	// public void updateLoginTime(Long id) {
	// User user = userDao.findOne(id);
	// user.setLoginTime(new Date());
	// }

	/*
	 * @see
	 * 
	 * com.simple.spark.system.service.user.UserService#findAuthorityByUsername
	 * (java.lang.String)
	 */
	@Override
	public List<String> findAuthorityNameByUsername(String username) {
		return userDao.findAuthorityNameByUsername(username);
	}

	@Override
	public List<Authority> findAuthorityByUsername(String username) {
		return userDao.findAuthorityByUsername(username);
	}

	@Override
	public User register(User user) {
		User findByUsername = userDao.findByUsername(user.getUsername());
		if (findByUsername != null)
			throw new BusinessException("用户已经存在");

		/* 在乐橙平台中添加用户 */
		HsviewClient m_client = new HsviewClient();
		m_client.setHost(Config.host);
		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����

		AddSubUser req = new AddSubUser();
		req.data.username = Config.devUser;

		AddSubUser.RequestData.SubUsersElement element = new AddSubUser.RequestData.SubUsersElement();
		element.username = user.getUsername();
		req.data.subUsers.add(element);

		AddSubUser.Response resp = (AddSubUser.Response) m_client.request(req, 30000);

		if (resp.getCode() == HttpStatus.SC_OK) {
			if (resp.getApiRetCode() == HsviewResponse.API_SUCCESS) {

			} else {
				logger.warn("[" + resp.getApiRetCode() + "] " + resp.getApiRetDesc());
				throw new BusinessException("[" + resp.getApiRetCode() + "] " + resp.getApiRetDesc());
			}
		} else {
			logger.error("[" + resp.getApiRetCode() + "] " + resp.getApiRetDesc());
			throw new BusinessException("[" + resp.getApiRetCode() + "] " + resp.getApiRetDesc());
		}

		return userDao.save(user);
	}
//	@Override
//	public User save(User user) {
//		return userDao.save(user);
//	}

	@Override
	public User update(User local) {
		return userDao.save(local);
		
	}

	// /*
	// * @see
	// *
	// com.simple.spark.system.service.user.UserService#updateUserPic(java.lang
	// * .String)
	// */
	// @Override
	// public void updateUserPic(String tname) {
	// User u = userDao.findOne(ContextUtils.getCurrentSecurityUser().getId());
	// u.setPic(tname);
	// }

	// /*
	// * @see
	// * com.simple.spark.system.service.user.UserService#findByIds(java.lang.
	// * String)
	// */
	// @Override
	// public List<User> findByIds(String ids) {
	// return userDao.findByIds(ids);
	// }

	// /*
	// * @see
	// * com.simple.spark.system.service.user.UserService#autoComplete(java.lang
	// * .String)
	// */
	// @Override
	// // @formatter:off
	// public List<AutoCompleteDto> autoComplete(String term) {
	// PageResult<User> list = userDao.findCombo(new PageParam(), term);
	// // 将User转换成AutoCompleteDto
	// List<AutoCompleteDto> result = BeanMapper.mapList(list.getRows(),
	// AutoCompleteDto.class, new BeanMapperChanger<User, AutoCompleteDto>() {
	// @Override
	// public void change(User source, AutoCompleteDto dest) {
	// dest.setId(source.getUsername());
	// dest.setLabel(source.getFullname() + " (" + source.getUsername() + ")");
	// dest.setValue(source.getUsername());
	// }
	// });
	// return result;
	// }
	// // // @formatter:on
	// public Iterable<User> findAll() {
	// return userDao.findAll();
	// }
	//
	// // /*
	// // * @see
	// // *
	// com.simple.spark.system.service.user.UserService#findSuperiorByUsername
	// // * (java.lang.String)
	// // */
	// // @Override
	// // public User findSuperiorByUsername(String username) {
	// // List<User> managers = findSuperiorsByUsername(username);
	// // User suprior = managers.get(0);// 因为结果按照idpath排序所以第一个就是最近的上级领导
	// // return suprior;
	// // }
	//
	// // /*
	// // * @see
	// // *
	// //
	// com.simple.spark.system.service.user.UserService#findSuperiorsByUsername
	// // * (java.lang.String)
	// // */
	// // @Override
	// // public List<User> findSuperiorsByUsername(String username) {
	// // User user = userDao.findByUsername(username);
	// // Organization userOrg = user.getOrganization();
	// // String idPath = userOrg.getIdPath();
	// //
	// // // 如果没有，则意味着自己是顶级组织的领导，则返回本部门领导
	// // if (userOrg.getParent() == null) {
	// // userOrg.getManager();
	// // }
	// //
	// // List<User> supriors;
	// // // 需要判断自己是不是本部门的部门领导,如果是则不在查询结果中
	// // if (userOrg.getManager() != null && userOrg.getManager().equals(user))
	// {
	// // supriors = Organization.findManagerByIdPath(idPath, false);
	// // } else {
	// // supriors = Organization.findManagerByIdPath(idPath, true);
	// // }
	// // if (supriors.isEmpty()) {
	// // throw new BusinessException("用户[" + user.getFullname() + "(" +
	// // user.getUsername() + ")]没有设置上级领导");
	// // }
	// // return supriors;
	// // }
	//
	// // /*
	// // * @see
	// // *
	// com.simple.spark.system.service.user.UserService#findByUsername(java.
	// // * lang.String)
	// // */
	// // @Override
	// // public List<UserDto> findByUsernames(String username) {
	// // List<UserDto> result = new ArrayList<UserDto>();
	// // if (StringUtils.isNotBlank(username)) {
	// // String userNames[] = username.split(",");
	// // for (String string : userNames) {
	// // if (StringUtils.isNotBlank(string)) {
	// // User user = userDao.findByUsername(string);
	// // UserDto dto = new UserDto();
	// // if (user != null) {
	// // dto = BeanMapper.map(user, UserDto.class);
	// // dto.setPassword(null);
	// // dto.setRepassword(null);
	// // result.add(dto);
	// // }
	// // }
	// // }
	// // }
	// //
	// // return result;
	// // }
	//
	// // @Override
	// // public String findFullnamesByUsernames(String usernames) {
	// // if (StringUtils.isBlank(usernames)) {
	// // return null;
	// // }
	// // return userDao.findFullnamesByUsernames(usernames);
	// // }
	//
	// // @Override
	// // public String findFullnamesAndOriginazationNameByUsername(String
	// // username) {
	// // User user = userDao.findByUsername(username);
	// // if (user == null)
	// // return username;
	// // Organization org = user.getOrganization();
	// // String fullname = user.getFullname();
	// // if (org != null) {
	// // fullname += "(" + org.getName() + ")";
	// // }
	// // return fullname;
	// // }
	//
	// // /*
	// // * @see
	// // *
	// //
	// com.simple.spark.system.service.user.UserService#findUserByAuthorityName
	// // * (java.lang.String)
	// // */
	// // @Override
	// // public List<User> findUserByAuthorityName(String authName) {
	// // return userDao.findUserByAuthorityName(authName);
	// // }
	//
	// // /*
	// // * @see com.simple.spark.system.service.user.UserService#
	// // * findOrginazitionTreeUsersByUsernameAndPosition(java.lang.String,
	// // * java.lang.String)
	// // */
	// // @Override
	// // public List<User>
	// findOrginazitionTreeUsersByUsernameAndPosition(String
	// // username, Long posId) {
	// // return
	// userDao.findOrginazitionTreeUsersByUsernameAndPosition(username,
	// // posId);
	// // }
	//
	// public void setUserDao(UserDao userDao) {
	// this.userDao = userDao;
	// }
	//
	// public void save(User user) {
	// userDao.save(user);
	// }
	//
	// public void update(User user) {
	// userDao.save(user);
	// }
	//
	// @Override
	// public List<String> findAuthorityNameByUsername(String username) {
	// return null;
	// }

}
